/**
 * ECharts图表配置属性工具库
 * 提供图表属性定义、类型映射和配置转换等功能
 */

/**
 * 每个Echart需要监听的属性
 * 通用图表属性配置
 * 按组件类型分类，支持不同图表类型（柱状图、饼图等）按需使用
 */
const chartObserverConfig = {
    // 标题属性（所有图表通用）
    title: [
        'title-show_radio', // 显示
        'title-text_text',  // 标题名
        'title-textstyle-color_colorpicker', // 标题颜色
        'title-textstyle-fontsize_number', // 标题字号
        'title-textstyle-fontweight_select', // 标题字体粗细
        'title-textstyle-fontstyle_select', // 标题字体样式
        'title-subtext_text',   // 标题副文本
        'title-subtextstyle-color_colorpicker', // 标题副文本颜色
        'title-subtextstyle-fontsize_number', // 标题副文本字号
        'title-subtextstyle-fontweight_select', // 标题副文本字体粗细
        'title-subtextstyle-fontstyle_select', // 标题副文本字体样式
        'title-left_slider', // 标题位置
        'title-top_slider', // 标题位置
        'title-right_slider',// 标题位置
        'title-bottom_slider',// 标题位置
        'title-itemgap_number', //主副标题之间的间距
        'title-textalign_select'  //整体（包括 text 和 subtext）的水平对齐。
    ],

    // 网格属性（带坐标轴的图表使用，如柱状图、折线图）
    grid: [
        'grid-left_slider',
        'grid-right_slider',
        'grid-bottom_slider',
        'grid-top_slider',
        'grid-containlabel_radio' // 是否包含坐标轴的刻度标签
    ],

    // X轴属性（带X轴的图表使用）
    xAxis: [
        'xaxis-show_radio', // 显示
        'xaxis-axislabel-show_radio', // 是否显示刻度标签。
        'xaxis-max_number', // x 轴最大值
        'xaxis-min_number', // x 轴最小值
        'xaxis-position_select', // X轴标签的位置
        'xaxis-offset_number', // X轴标签距离X轴距离

        'xaxis-nametextstyle-color_colorpicker',  //名称的颜色
        'xaxis-nametextstyle-fontsize_number', // 名称的字体大小
        'xaxis-nametextstyle-fontweight_select', // 名称的字体粗细
        'xaxis-nametextstyle-fontstyle_select', // 名称字体样式
        'xaxis-axislabel-color_colorpicker', // X轴标签颜色
        'xaxis-axislabel-interval_number', // 强制显示刻度标签，默认显示  为0 则强制显示所有标签
        'xaxis-axislabel-replace_radio', // 强制显示刻度标签，默认显示  为0 则强制显示所有标签
        'xaxis-max-char_radio', // 强制显示刻度标签，默认显示  为0 则强制显示所有标签
        'xaxis-axislabel-rotate_number', // X轴标签旋转角度
        'xaxis-inverse_radio', // 是否反向坐标轴
        'xaxis-axisline-show_radio', // 是否显示坐标轴线
        'xaxis-axisline-linestyle-color_colorpicker', // 坐标轴线颜色
        'xaxis-axisline-linestyle-width_number', // 坐标轴线宽度

        'xaxis-name_text', // 坐标名称
        'xaxis-vertical-show_radio',
        'xaxis-splitline-show_radio', //分割线是否显示
        'xaxis-splitline-linestyle-color_colorpicker', // 分割线颜色
        'xaxis-splitline-linestyle-width_number', // 分割线宽度
        'xaxis-type_text', // 坐标轴类型
        'xaxis-data_array', // 坐标轴数据
        'xaxis-axislabel-formatter_text' // 数值格式
    ],

    // Y轴属性（带Y轴的图表使用）
    yAxis: [
        'yaxis-show_radio', // 显示
        'yaxis-axislabel-show_radio', // 是否显示刻度标签。
        'yaxis-max_number', // y 轴最大值
        'yaxis-min_number', // y 轴最小值
        'yaxis-position_select', // Y轴标签的位置
        'yaxis-offset_number', // Y轴标签距离Y轴距离

        'yaxis-nametextstyle-color_colorpicker',  //名称的颜色
        'yaxis-nametextstyle-fontsize_number', // 名称的字体大小
        'yaxis-nametextstyle-fontweight_select', // 名称的字体粗细
        'yaxis-nametextstyle-fontstyle_select', // 名称字体样式
        'yaxis-axislabel-color_colorpicker', // Y轴标签颜色
        'yaxis-axislabel-interval_number', // 强制显示刻度标签
        'yaxis-scale_radio', // 是否从零开始
        'yaxis-axislabel-rotate_number', // Y轴标签旋转角度
        'yaxis-inverse_radio', // 是否反向坐标轴
        'yaxis-axisline-show_radio', // 是否显示坐标轴线
        'yaxis-axisline-linestyle-color_colorpicker', // 坐标轴线颜色
        'yaxis-axisline-linestyle-width_number', // 坐标轴线宽度

        'yaxis-name_text', // 坐标名称
        'yaxis-vertical-show_radio',
        'yaxis-splitline-show_radio', //分割线是否显示
        'yaxis-splitline-linestyle-color_colorpicker', // 分割线颜色
        'yaxis-splitline-linestyle-width_number', // 分割线宽度
        'yaxis-type_text', // 坐标轴类型
        'yaxis-data_array', // 坐标轴数据
        'yaxis-axislabel-formatter_text', // 刻度标签格式化
    ],

    // 图例属性（大部分图表通用）
    legend: [
        'legend-show_radio',
        'legend-textstyle-color_colorpicker',
        'legend-textstyle-fontsize_number',
        'legend-textstyle-fontweight_select',
        'legend-textstyle-fontstyle_select',
        'legend-itemstyle-color_colorpicker',
        'legend-itemheight_number',
        'legend-itemwidth_number',
        'legend-bottom_number',
        'legend-top_number',
        'legend-right_number',
        'legend-left_number',
        'legend-itemgap_number',
        'legend-orient_select', // 图例排列方向（横/竖）
        'legend-selectmode_select' // 选择模式
    ],

    // 提示框属性
    tooltip: [
        'tooltip-show_radio',
        'tooltip-trigger_select', // 触发方式
        'tooltip-axispointer-type_select',
        'tooltip-axispointer-snap_radio', // 是否自动吸附
        'tooltip-axispointer-label-show_radio',
        'tooltip-axispointer-label-color_colorpicker',
        'tooltip-axispointer-label-fontsize_number',
        'tooltip-axispointer-label-fontweight_select',
        'tooltip-axispointer-label-fontstyle_select',
        'tooltip-axispointer-linestyle-color_colorpicker',
        'tooltip-axispointer-linestyle-width_number',
        'tooltip-formatter_text', // 提示框格式化器
        'tooltip-backgroundcolor_colorpicker', // 背景色
        'tooltip-bordercolor_colorpicker', // 边框色
        'tooltip-borderwidth_number', // 边框宽度
        'tooltip-padding_number' // 内边距
    ],

    // 数值显示属性 (饼图可能不适用)
    label: [
        'series-label-show_radio', // 是否显示
        'series-label-position_select', // 数值显示位置
        'series-label-distance_number', // 数值显示的距离
        'series-label-color_colorpicker', // 数值显示颜色
        'series-label-fontsize_number', // 数值显示的字体大小
        'series-label-fontweight_select', // 数值显示字体粗细
        'series-label-fontstyle_select', // 数值显示字体样式
        'series-label-formatter_text', // 标签格式化器
        'series-labelline-show_radio' // 是否显示标签线
    ],

    // 柱状图系列属性（仅柱状图使用）
    barSeries: [
        'series-barmaxwidth_slider',
        'series-itemstyle-borderradius_number',
        'series-bargap_text',
        'series-barminheight_slider',
        'series-showbackground_radio',
        'series-backgroundstyle-color_colorpicker',
        'series-backgroundstyle-bordercolor_colorpicker',
        'series-backgroundstyle-borderwidth_number',
        'series-backgroundstyle-bordertype_select',
        'series-backgroundstyle-opacity_slider',
        'series-labelline-linestyle-color_colorpicker',
        'series-labelline-linestyle-width_number',
        'series-itemstyle-color_array',
        'series-itemstyle-bordercolor_colorpicker',
        'series-itemstyle-borderradius_slider',
        'series-barminwidth_slider',
        'series-emphasis-itemstyle-shadowblur_number',
        'series-emphasis-itemstyle-shadowcolor_colorpicker',
        'series-stack_text', // 堆叠名称
        'series-barcategorygap_text' // 类目间距
    ],

    // 饼图系列属性（仅饼图使用）
    pieSeries: [
        'pie-inner_number', // 内半径
        'pie-outer_number', // 外半径
        'pie-clockwise_radio', // 饼图是否顺时针
        'pie-startangle_number', // 起始角度
        'pie-minangle_number', // 最小角度
        'pie-minshowlabelangle_number', // 小于这个角度的扇区不显示标签
        'pie-itemstyle-borderradius_text',
        'pie-roseType_select', // 是否展示为南丁格尔图
        'pie-selectedmode_select', // 选中模式
        'pie-selectedoffset_number', // 选中时的偏移量
        'pie-padangle_number' // 扇区的角度
    ],

    // 折线图系列属性（仅折线图使用）
    lineSeries: [
        'line-showsymbol_radio', // 折线点是否显示
        'line-symbol_select', // 折线点样式
        'line-symbolsize_slider', // 折线点大小
        'line-lineStyle-width_number', // 折线宽度
        'line-smooth_radio', // 折线是否平滑
        'line-smooth-monotone_select', // 平滑单调性
        'line-areastyle-show_radio', // 折线区域是否显示
        'line-areastyle-color_colorlist', // 折线区域填充颜色
        'line-areastyle-color-gradient-show_radio', // 折线区域填充颜色是否渐变
        'line-areastyle-color-start_colorlist', // 渐变起始颜色
        'line-areastyle-color-end_colorlist',   // 渐变结束颜色
        'line-endlabel-show_radio',        // 末端标签
        'line-endlabel-formatter_text',    // 标签格式
        'line-endlabel-distance_number',   // 标签距离
        'line-endlabel-color_colorpicker', // 标签颜色
        'line-stack_text', // 堆叠名称
        'line-step_select', // 阶梯线类型
        'line-linestyle-color_colorpicker', // 折线颜色
        'line-areastyle-color-gradient-show_radio', // 是否渐变色
    ],

    // 雷达图系列属性（仅雷达图使用）
    radarSeries: [

        'radar-indicator_text', // 雷达图指示参数
        'radar-axisline-linestyle-width_number', //轴线宽度
        'radar-shape_select', // 雷达图图形样式
        'radar-splitnumber_number', // 雷达图坐标轴的分割段数
        'radar-axisline-linestyle-color_colorpicker', // 雷达图坐标轴颜色
        'radar-axisline-linestyle-opacity_number', //坐标轴线的透明度
        'radar-splitline-show_radio', // 是否显示坐标轴线
        'radar-splitline-linestyle-color_colorpicker',
        'radar-splitline-linestyle-opacity_number',
        'radar-indicator_array', // 雷达图指示器
        'radar-name-show_radio', // 是否显示指示器名称
        'radar-name-textstyle-color_colorpicker', // 指示器名称颜色
        'radar-radius_slider', // 半径
        'radar-splitarea-color_array', // 半径
        'radar-splitline-linestyle-width_number', // 分割线宽度
    ],

    // 散点图系列属性（仅散点图使用）
    scatterSeries: [
        'scatter-symbolsize_number', // 点大小
        'scatter-symbol_select', // 点样式
        'scatter-large_radio', // 是否启用大规模散点优化
        'scatter-largethreshold_number', // 大规模散点阈值
        'scatter-itemstyle-color_colorpicker', // 点颜色
        'scatter-label-show_radio', // 是否显示标签
        'scatter-label-position_select' // 标签位置
    ],

    // 基础属性（所有图表通用）
    base: [
        'base-data-url_text',          // 数据接口地址
        'base-echart-init-script_text',// 初始化脚本
        'base-echart-timer_number',    // 定时器间隔（秒）
        'base-echart-timer-script_text', // 定时器执行脚本
        'base-background-color_colorpicker', // 图表背景色
        'base-animation_radio',        // 是否开启动画
        'base-animationduration_number' // 动画时长
    ]
};

/**
 * 获取指定图表类型的属性列表
 * @param {string} chartType - 图表类型（如 'bar' 柱状图、'pie' 饼图）
 * @returns {string[]} 该类型图表支持的属性列表
 */
function getAttributesByType(chartType) {
    // 定义各类型图表支持的属性组，修复line类型重复定义问题
    const typeMap = {
        bar: ['title', 'grid', 'xAxis', 'yAxis', 'legend', 'tooltip', 'label', 'barSeries', 'base'],
        pie: ['title', 'legend', 'tooltip', 'label', 'pieSeries', 'base'],
        line: ['title', 'grid', 'xAxis', 'yAxis', 'legend', 'tooltip', 'label', 'lineSeries', 'base'],
        radar: ['title', 'legend', 'tooltip', 'label', 'radarSeries', 'base'],
        scatter: ['title', 'grid', 'xAxis', 'yAxis', 'legend', 'tooltip', 'label', 'scatterSeries', 'base']
    };

    // 验证图表类型是否支持
    if (!typeMap[chartType]) {
        console.warn(`不支持的图表类型: ${chartType}，默认使用基础属性`);
        return [...chartObserverConfig.title, ...chartObserverConfig.base];
    }

    // 合并该类型支持的所有属性组，过滤无效属性
    return typeMap[chartType]
        .flatMap(group => chartObserverConfig[group] || [])
        .filter(attr => typeof attr === 'string' && attr.trim() !== '');
}

/**
 * 根据图表类型返回分组的属性列表（保留分组结构）
 * @param {string} chartType - 图表类型（bar/pie/line等）
 * @returns {Object} 分组的属性列表，键为属性组名称，值为属性数组
 */
function getGroupedAttributesByType(chartType) {
    // 定义各类型图表支持的属性组
    const typeMap = {
        bar: ['title', 'grid', 'xAxis', 'yAxis', 'legend', 'tooltip', 'label', 'barSeries', 'base'],
        pie: ['title', 'legend', 'tooltip', 'label', 'pieSeries', 'base'],
        line: ['title', 'grid', 'xAxis', 'yAxis', 'legend', 'tooltip', 'label', 'lineSeries', 'base'],
        radar: ['title', 'legend', 'tooltip', 'label', 'radarSeries', 'base'],
        scatter: ['title', 'grid', 'xAxis', 'yAxis', 'legend', 'tooltip', 'label', 'scatterSeries', 'base']
    };

    // 验证图表类型是否支持
    if (!typeMap[chartType]) {
        console.warn(`不支持的图表类型: ${chartType}，默认使用基础属性`);
        return {
            title: chartObserverConfig.title,
            base: chartObserverConfig.base
        };
    }

    // 构建分组属性对象，过滤无效组
    const groupedAttributes = {};
    typeMap[chartType].forEach(group => {
        if (chartObserverConfig[group] && Array.isArray(chartObserverConfig[group])) {
            groupedAttributes[group] = chartObserverConfig[group].filter(
                attr => typeof attr === 'string' && attr.trim() !== ''
            );
        }
    });

    return groupedAttributes;
}

// 暴露到全局作用域（window对象）
window.getAttributesByType = getAttributesByType;
window.getGroupedAttributesByType = getGroupedAttributesByType;
